import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { randomUUID } from 'crypto'; // 生成随机密钥
import { ApiKey } from './entities/api-key.entity';

@Injectable()
export class ApiKeyService {
  constructor(
    @InjectRepository(ApiKey)
    private apiKeyRepo: Repository<ApiKey>,
  ) { }

  // 生成 API Key 和 API Secret 并存储
  async generateApiKeyPair(
    userId: string, // 关联的用户ID
    allowedModules: string[],
    totalQuota: number,
    expiresIn: number = 30 * 24 * 60 * 60, // 30天有效期（秒）
  ) {
    // 1. 生成 API Key（公开标识，格式可自定义）
    const apiKey = `AKIA${randomUUID().toUpperCase().replace(/-/g, '').slice(0, 16)}`;

    // 2. 生成 API Secret（私密密钥，客户端需妥善保存）
    const apiSecret = randomUUID().replace(/-/g, '') + randomUUID().replace(/-/g, ''); // 长密钥

    // 3. 计算过期时间
    const expiresAt = new Date();
    expiresAt.setSeconds(expiresAt.getSeconds() + expiresIn);

    // 4. 存储到数据库（加密 API Secret）
    const apiKeyEntity = this.apiKeyRepo.create({
      apiKey,
      allowedModules,
      totalQuota,
      usedQuota: 0,
      expiresAt,
    });
    apiKeyEntity.setApiSecret(apiSecret); // 加密存储 Secret
    await this.apiKeyRepo.save(apiKeyEntity);

    // 注意：API Secret 仅在生成时返回一次，后续无法查询（需客户端保存）
    return {
      apiKey,
      apiSecret, // 仅返回一次！
      expiresAt,
      userId,
    };
  }

  // 根据 API Key 查询权限配置
  async findByApiKey(apiKey: string) {
    return this.apiKeyRepo.findOne({ where: { apiKey } });
  }

  // 更新资源使用次数
  async updateUsedQuota(apiKey: string) {
    const entity = await this.findByApiKey(apiKey);
    if (!entity) return false;
    entity.usedQuota += 1;
    await this.apiKeyRepo.save(entity);
    return true;
  }
}